package unq.uis.robots.applicationsModels;


import java.io.Serializable;
import java.util.List;
import java.util.Vector;


import org.uqbar.commons.model.ObservableUtils;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import unq.uis.robots.model.Jugador;
import unq.uis.robots.model.Robot;
import unq.uis.robots.model.Sistema;

@Observable
public class JugadorVista implements Serializable{
	private static final long serialVersionUID = 1L;
	public static final String ROBOTS = "robots";
	public static final String ROBOTSELECCIONADO = "robotSeleccionado";
	public static final String OTROSROBOTS = "otrosRobots";
	public static final String SISTEMA = "sistema";
	public static final String ROBOTCONTRINCANTESELECCIONADO = "robotContrincanteSeleccionado";

	
	private Jugador jugador;	
	private Robot robotSeleccionado;
	private List<Robot> otrosRobots;
	private Sistema sistema;
	private Robot robotContrincanteSeleccionado;
	private String misRobotsFiltro = "";
	private String robotsDelSistemaFiltro = "";
	
	public JugadorVista(Jugador jugador){
		this.jugador = jugador;
		this.sistema = Sistema.getInstance();
		this.otrosRobots = this.sistema.getRobots(this.jugador);	
	}
	
	public List<Robot> getRobots() {
		return this.jugador.getRobots();
	}
	
	public void actualizarDatos(){
		ObservableUtils.forceFirePropertyChanged(this, "robots", getRobots());
	}
	
	public void setRobots(List<Robot> robots){
		this.jugador.setRobots(robots);
	}
	
	public void setNombre(String nombre){
		this.jugador.setNombre(nombre);
	}
	
	public String getNombre() {
		return this.jugador.getNombre();
	}	
	
	public List<Robot> getOtrosRobots() {
		return otrosRobots;
	}
	
	public void setOtrosRobots(List<Robot> otrosRobots) {
		this.otrosRobots = otrosRobots;
	}

	public Robot getRobotSeleccionado() {
		return robotSeleccionado;
	}

	public void setRobotSeleccionado(Robot robotSeleccionado) {
		this.robotSeleccionado = robotSeleccionado;	
	}		
	
	public Jugador getJugador() {
		return jugador;
	}
	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}

	public Robot getRobotContrincanteSeleccionado() {
		return robotContrincanteSeleccionado;
	}

	public void setRobotContrincanteSeleccionado(Robot robotContrincanteSeleccionado) {
		this.robotContrincanteSeleccionado = robotContrincanteSeleccionado;
	}

	public void validaSePuedeCompetir() {
		if (this.getRobotSeleccionado() == null  || this.getRobotContrincanteSeleccionado() == null) {
			throw new UserException("Debe seleccionar un robot propio y un robot de otro usuario!");
		}
	}
	
	public Sistema getSistema(){
		return Sistema.getInstance();
	}
	
	public List<Robot> getRobotsSistema(){
		return Sistema.getInstance().getRobotsSistema();
	}
	
	public int getDinero(){
		return this.jugador.getDinero();
	}
	
	public void validarQueElRobotTengaDanio() {
		if(this.getRobotSeleccionado().getDanio() == 0)
			throw new UserException("Este robot no se puede reparar porque no tiene daño");		
	}
	
	public Robot buscarRobotDelJugador(long id){
		Robot robot = null;
		for(Robot current : this.getRobots()){
			if(current.getId() == id)
				robot = current;
		}
		return robot;
	}
	
	public List<Robot> getMisRobotsFiltrados() {
		return this.filtrarRobots(this.getRobots(),this.getMisRobotsFiltro());
	}	
	
	public List<Robot> getRobotsDelSistemaFiltrados() {
		return this.filtrarRobots(this.getRobotsSistema(),this.getRobotsDelSistemaFiltro());
	}
	
	public List<Robot> filtrarRobots(List<Robot> robots,String filtro){
		List<Robot> seleccionDeRobots = new Vector<Robot>();
		for (Robot robot : robots) {
			if (robot.getNombre().contains(filtro)) {
				seleccionDeRobots.add(robot);
			}
		}
		return seleccionDeRobots;
	}

	public Robot buscarRobotDelSistema(long idRobot) {
		Robot robot = null;
		for(Robot current : this.getRobotsSistema()){
			if(current.getId() == idRobot)
				robot = current;
		}
		return robot;
	}	

	public String getMisRobotsFiltro() {
		return misRobotsFiltro;
	}

	public void setMisRobotsFiltro(String misRobotsFiltro) {
		this.misRobotsFiltro = misRobotsFiltro;
	}

	public String getRobotsDelSistemaFiltro() {
		return robotsDelSistemaFiltro;
	}

	public void setRobotsDelSistemaFiltro(String robotsDelSistemaFiltro) {
		this.robotsDelSistemaFiltro = robotsDelSistemaFiltro;
	}
	
	
}
